﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AutocompleteMenuNS;
using Common;
using HDQApp.Common;
using Sunisoft.IrisSkin;

namespace HDQApp
{
    public partial class MainForm : Form
    {

        //皮肤引擎类
        public static SkinEngine skin = new SkinEngine();
        public MainForm()
        {
            InitializeComponent();

            //生成自动完成菜单
            BuildAutocompleteMenu();

            //为KeyDown能应用到所有控件上 注册 KeyDown 事件 
          
            this.KeyDown += control_KeyDown;
            this.KeyPreview = true;
        }

        /// <summary>
        /// 快捷键打开 对应窗体
        /// </summary>
        void control_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F2)
            {
                btnProcMgr_Click(sender, e);
            }
            else if (e.KeyCode == Keys.F3)
            {
                btnAddAttr_Click(sender, e);
            }
            else if (e.KeyCode == Keys.F4)
            {
                btnAnalyse_Click(sender, e);
            }
            else if (e.KeyCode == Keys.F5)
            {
                btnBuildProc_Click(sender, e);
            }
        }
        private void MainForm_Load(object sender, EventArgs e)
        {
            //初始化皮肤
            InitSkin();

            //初始化默认存储过程名称
            InitProcName();

            //快捷键的设置功能 暂时不做。
            btnShortKey.Visible = false;
        }
        private void InitSkin()
        {
            //从程序根目录查询 皮肤文件
            string[] ssks = Directory.GetFiles(Environment.CurrentDirectory, "*.ssk");
            if (ssks.Length > 0)
            {
                //设置第一个皮肤文件为当程序皮肤
                skin.SkinFile = ssks[0];
                skin.Active = true;
            }
        }

        /// <summary>
        /// 指定 命名规则 存储过程名称
        /// </summary>
        private void InitProcName()         //组建存储过程名称
        {
            txtProcName.Text = "proc_HDQ_" + DateTime.Now.ToString("yyyyMMdd") + new Random().Next(1, 5001);        //=========Random().Next(1, 5001)这个随机获得的序号可能出现重复序号==========
        }

        /// <summary>
        /// 生成自动完成菜单
        /// </summary>
        private void BuildAutocompleteMenu()                                //获取关键列表，并组件下来菜单项目
        {
            List<string> lstAutoWords = new List<string>();
            lstAutoWords.AddRange(SQLHandler.GetKeyWordsByBlue());          //SQL关键字
            lstAutoWords.AddRange(SQLHandler.GetKeyWordsByPeony());         //SQL函数
            lstAutoWords.AddRange(SQLHandler.GetKeyWordsByGray());          //SQL逻辑运算符

            try
            {
                //从数据中查询自定义特性 准备自动完成的 关键字
                lstAutoWords.AddRange(SQLHandler.GetCustomeAttr());         //用户特性
            }
            catch (Exception ex)
            {
                LogUtil.LogError("HDQApp出错", Developer.SysDefault, ex);
                MessageBox.Show(ex.Message + "\r\n 详情请查看日志!", "出错啦!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            var items = new List<AutocompleteItem>();                           //创建AutocompleteItem类的列表对象

            //遍历生成 自动完成项 对象，并指定只用imageList 中的索引为1 的ico图片。
            foreach (var item in lstAutoWords)
                items.Add(new AutocompleteItem(item) { ImageIndex = 1 });       //把关键字的列表对象转换为AutocompleteItem类的列表对象

            //设置 自动完成对象菜单对象  的可自动完成项
            autocompleteMenu1.SetAutocompleteItems(items);                      //组件下来菜单项目
        }

        /// <summary>
        /// 查询存储过程是否存在
        /// </summary>
        /// <returns></returns>
        private bool ExistProc()                                        //判断存储过程是否存在
        {
            string sel_sql = "select COUNT(a.name) cnt from sys.all_objects a,sys.sql_modules b where a.is_ms_shipped=0 and a.object_id = b.object_id and a.[type] in ('P')  AND a.name='{0}'";
            sel_sql = string.Format(sel_sql, txtProcName.Text.Trim());
            bool isExist = DbHelperMsSQL.Exists(sel_sql);               //用DbHelperMsSQL确定存储过程是否已存在
            return isExist;
        }

        private void btnAnalyse_Click(object sender, EventArgs e)       //[分析]按钮事件
        {
            string msg = string.Empty;
            if (string.IsNullOrWhiteSpace(txtProcName.Text))            //存储过程名不能空
            {
                SetMsg(false, "提示：存储过程名称不能为空！");
            }
            string operateProc = ExistProc() ? "alter" : "create";      //根据存储过程是否存在来判断使用"alter"还是"create"
            //验证可能带有声明变量的SQL文本有无语法错误  ====>很关键
            bool isOk = SQLHandler.Validate(operateProc, txtProcName.Text.Trim(), SyntaxTBox.Text, false, out msg);
            SetMsg(isOk, msg);                                          //不管有错没错都会显示提示，只是有错是红色显示。
            if (!isOk)              //如果没有错误就返回
            {
                return;             //===================个方法没有返回值的要求,是否没有必要return？？？？？====================
            }
        }

        /// <summary>
        /// 设置提醒信息
        /// </summary>
        /// <param name="isok">是否成功</param>
        /// <param name="msg">提示消息</param>
        void SetMsg(bool isok, string msg)                              //提示框
        {
            txtResult.Text = msg;
            txtResult.ForeColor = isok ? Color.Green : Color.Red;       //如果isok为真则绿色提示，isok为假则红色提示
        }

        private void btnBuildProc_Click(object sender, EventArgs e)     //[存储过程]按钮事件
        {
            btnAnalyse_Click(sender, e);                                //调用[分析]按钮事件

            string msg = string.Empty;
            if (string.IsNullOrWhiteSpace(txtProcName.Text))            //存储过程名不能空
            {
                SetMsg(false, "提示：存储过程名称不能为空！");
            }
            string operateProc = ExistProc() ? "alter" : "create";

            bool isOk = SQLHandler.Exec(operateProc, txtProcName.Text.Trim(), SyntaxTBox.Text, out msg);
            SetMsg(isOk, msg);
            if (!isOk)
            {
                return;         //？？？
            }
            else
            {
                //重新默认 下次要生成的 存储过程名称
                InitProcName();                     //重新获取存储过程名称
                SyntaxTBox.Text = string.Empty;     //保存成功就清除编辑框中的内容
            }
        }


        private void btnAddAttr_Click(object sender, EventArgs e)       //[自定义特性]按钮事件
        {
            AttrMgrForm mgrForm = new AttrMgrForm();
            DialogResult dResult = mgrForm.ShowDialog();                //对话方式打开子窗体
            //自定义特性窗口关闭后，特征名称可能有增加或减少，重新加载，以备 自动提示使用
            BuildAutocompleteMenu();                                    //重新加载自动提示菜单项
        }

        private void btnProcMgr_Click(object sender, EventArgs e)
        {
            ProcMgrForm procMgrForm = new ProcMgrForm();
            DialogResult dResult = procMgrForm.ShowDialog();            //对话方式打开子窗体
        }

        private void btnShortKey_Click(object sender, EventArgs e)      //[快捷键]按钮事件
        {
            ShortcutKeyForm skForm = new ShortcutKeyForm();
            DialogResult dResult = skForm.ShowDialog();                 //对话方式打开子窗体
            this.Refresh();                                             //重新调入主窗体=刷新
        }

    }
}
